<!doctype html public "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
<html>
<head>
<title>
 Overview
</title>
<link rel ="stylesheet" type="text/css" href="stylesheet.css" title="Style">
<script>
function asd() {
	
		parent.document.title="OpenNetworks_v01.js Overview";
	
}
</script>
</head>
<body bgcolor="white" onload="asd();">

<!-- ========== START OF NAVBAR ========== -->
<a name="navbar_top"><!-- --></a>
<table border="0" width="100%" cellpadding="1" cellspacing="0">
<tr>
<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
<a name="navbar_top_firstrow"><!-- --></a>
<table border="0" cellpadding="0" cellspacing="3">
  <tr align="center" valign="top">
  
  
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a>&nbsp;</td>
  <td bgcolor="#FFFFFF" class="NavBarCell1Rev">	&nbsp;<font class="NavBarFont1Rev"><b>File</b></font>&nbsp;</td>
  

  <td bgcolor="#FFFFFF" class="NavBarCell1"> 	<font class="NavBarFont1">Class</font>&nbsp;</td>
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a>&nbsp;</td>
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a>&nbsp;</td>
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a>&nbsp;</td>
  </tr>
</table>
</td>
<td bgcolor="#EEEEFF" align="right" valign="top">
<em>
<b></b></em>
</td>
</tr>

<tr>
<td bgcolor="white" class="NavBarCell2"><font size="-2">
&nbsp;PREV&nbsp;
&nbsp;NEXT</font></td>
<td bgcolor="white" class="NavBarCell2"><font size="-2">
  <a href="index.html" target="_top"><b>FRAMES</b></a>  &nbsp;
&nbsp;<a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
&nbsp;&nbsp;
<script>
  <!--
  if(window==top) {
    document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
  }
  //-->
</script>
<noscript>
<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
</noscript>
</font></td>
</tr>
</table>
<!-- =========== END OF NAVBAR =========== -->

<hr>
<center>
	
	   <h2>OpenNetworks_v01.js</h2>
	
</center>

	


<h4>Summary</h4>
<p>
	
		No overview generated for 'OpenNetworks_v01.js'<BR/><BR/>
	
</p>

<hr>


    <table border="1" cellpadding="3" cellspacing="0" width="100%">
    <tr bgcolor="#CCCCFF" class="TableHeadingColor">
    <td colspan=2><font size="+2">
    
        <b>Class Summary</b>
    
    </font></td>
    </tr>
    
    <tr bgcolor="white" class="TableRowColor">
    <td width="15%"><b><a href="c_ImageOverlay.html">c_ImageOverlay</a></b></td>
    <td>&nbsp;</td>
    </tr>
    
    <tr bgcolor="white" class="TableRowColor">
    <td width="15%"><b><a href="c_OverlayMapType.html">c_OverlayMapType</a></b></td>
    <td>&nbsp;</td>
    </tr>
    
    <tr bgcolor="white" class="TableRowColor">
    <td width="15%"><b><a href="c_TextOverlay.html">c_TextOverlay</a></b></td>
    <td>&nbsp;</td>
    </tr>
    
    <tr bgcolor="white" class="TableRowColor">
    <td width="15%"><b><a href="Network.html">Network</a></b></td>
    <td>&nbsp;</td>
    </tr>
    
    </table>
    <hr/> 


<!-- ========== METHOD SUMMARY =========== -->

	<a name="method_summary"><!-- --></a>
	<table border="1" cellpadding="3" cellspacing="0" width="100%">
		<tr bgcolor="#CCCCFF" class="TableHeadingColor">
			<td colspan=2>
				<font size="+2">
					<b>Method Summary</b>
				</font>
			</td>
		</tr>
	
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!centerMap">centerMap</a></b>(map, LatLng)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!clearCurrentShortestPathEdges">clearCurrentShortestPathEdges</a></b>()
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!clearShortestPathInfo">clearShortestPathInfo</a></b>()
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!closeInfoBox">closeInfoBox</a></b>(idx, cur_div)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!closeInfoBoxes">closeInfoBoxes</a></b>()
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!create_network">create_network</a></b>(node_edge_obj)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!createAnchorControlDiv">createAnchorControlDiv</a></b>(outer_text, link_text, link, onclick)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!createAnchorControlDivStyled">createAnchorControlDivStyled</a></b>(outer_text, link_text, link, onclick, idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!createCheckboxControlDiv">createCheckboxControlDiv</a></b>(outer_text, checked, onclick)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!createInfoBox">createInfoBox</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!createRadioButtonControlDiv">createRadioButtonControlDiv</a></b>(outer_text, grp_name, checked, onclick)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!createSPNodeDiv">createSPNodeDiv</a></b>(name, type)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!createTextDiv">createTextDiv</a></b>(inner_text, id)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!drawShortestPath">drawShortestPath</a></b>()
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!drawShortestPathEdges">drawShortestPathEdges</a></b>(edgeArray)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!getNodeNeighbors">getNodeNeighbors</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!initAuthorEdges">initAuthorEdges</a></b>(edgeArray)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!initAuthorNodes">initAuthorNodes</a></b>(nodeArray)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!initAuthorRanking">initAuthorRanking</a></b>(idxArray)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!initEdge">initEdge</a></b>(edgeOpts, from_bound, to_bound, map)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!initialize_old">initialize_old</a></b>(uimg_dir)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!openInfoBox">openInfoBox</a></b>(idx, rank_idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!registerClick">registerClick</a></b>(idx, is_map_click)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!registerInfoClick">registerInfoClick</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!registerNodeClick">registerNodeClick</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!resetNodeImage">resetNodeImage</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!resetSPNode">resetSPNode</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!searchAuthors">searchAuthors</a></b>(searchStr)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!setNodeImageToDest">setNodeImageToDest</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!setNodeImageToSelected">setNodeImageToSelected</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!setNodeImageToSource">setNodeImageToSource</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!setShortestPathNode">setShortestPathNode</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;Object</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!setShortestPathNode_old">setShortestPathNode_old</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!setSPNodeToDest">setSPNodeToDest</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!setSPNodeToSource">setSPNodeToSource</a></b>(idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!showNetworkNodes">showNetworkNodes</a></b>(show)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!toggleInfoBox">toggleInfoBox</a></b>(idx, rank_idx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!update_network_edges">update_network_edges</a></b>(node_edge_obj)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!update_text">update_text</a></b>()
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!updateEdges_old">updateEdges_old</a></b>(edgeArray)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
		   <tr bgcolor="white" class="TableRowColor">
		      <td align="right" valign="top" width="1%">
			 <font size="-1">
			    <code>static&nbsp;void</code>
			 </font>
		      </td>
		      <td>
			 <code>
			    <b>
			       <a href="GLOBALS.html#!s!writeShortestPathInfo">writeShortestPathInfo</a></b>(curPathNodeIdx)
			 </code>
			 <br>
			 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
			 
		      </td>
		   </tr>
		
	
	</table>
    <p>

<!-- ========== END METHOD SUMMARY =========== -->


        <pre class="sourceview"><span class="comment">// OpenNetworks_v01.js </span>
<span class="comment">// Javascript source file for OpenNetworks for Google Maps (v .01) API</span>
<span class="comment">// for displaying networks with custom Google Maps interface</span>
<span class="comment">//</span>
<span class="comment">//  Author:  James M. Hughes</span>
<span class="comment">//  Date  :  10/15/2010</span>
<span class="comment">//</span>
<span class="comment">//  N.B. Conforms to Google Maps API v3 (http://code.google.com/apis/maps/documentation/javascript/)</span>
<span class="comment">/*
  This software is distributed under the MIT License:

  The MIT License

    Copyright (c) &lt;year&gt; &lt;copyright holders&gt;

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in
    all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    THE SOFTWARE.
*/</span>

<span class="comment">/* GLOBAL VARS */</span>

<span class="comment">// from and to nodes for shortest path calculation</span>
var path_nodes = new Array();
var from_node = -1;
var to_node = -1;

<span class="comment">/* CUSTOM CLASSES */</span>

<span class="comment">/* Network constructor
    Builds a network object that contains the specified nodes and edges, placing
    the network in the HTML div div_id in a Google Maps viewer with
    options as provided.

    <span class="attrib">@param</span> div_id  Id of HTML element (div) where map will reside
    <span class="attrib">@param</span> nodes  Array of Node objects
    <span class="attrib">@param</span> edges  Array of Edge objects
    <span class="attrib">@param</span> map_opts JSON object of map options (see Google Maps API ref.)

*/</span>
<span class="reserved">function</span> Network(div_id, nodes, edges, map_opts) {
  <span class="comment">// Class members</span>

  <span class="comment">// Member functions</span>
  <span class="reserved">this</span>.initNodes = initNodes;
  <span class="reserved">this</span>.initEdges = initEdges;
  <span class="reserved">this</span>.initialize = initialize;
  <span class="reserved">this</span>.showNodes = showNodes;
  <span class="reserved">this</span>.hideNodes = hideNodes;

  <span class="comment">// updater functions</span>
  <span class="reserved">this</span>.updateEdges = updateEdges;

  <span class="comment">// Member data</span>
  <span class="comment">// Div id where map is stored</span>
  <span class="reserved">this</span>.div_id = div_id;

  <span class="comment">// Actual google map</span>
  <span class="reserved">this</span>.imgmap = null;
  <span class="comment">// Initialize map</span>
  <span class="reserved">this</span>.initialize();
  
  <span class="comment">// Map options</span>
  <span class="reserved">if</span> (map_opts != null) {
    <span class="reserved">this</span>.map_opts = map_opts; 
  }
  <span class="reserved">else</span> { <span class="comment">// set some default options</span>
    map_opts = null;
  }

  <span class="comment">// nodes</span>
  <span class="reserved">this</span>.nodes = null;
  <span class="comment">// Actual node objects</span>
  <span class="reserved">this</span>.Nodes = new Array();
  <span class="comment">// edges</span>
  <span class="reserved">this</span>.edges = null;
  <span class="comment">// Actual edge objects</span>
  <span class="reserved">this</span>.Edges = new Array();

  <span class="comment">// set nodes</span>
  <span class="reserved">if</span> (nodes != null) {
    <span class="comment">// initialize</span>
    <span class="reserved">this</span>.initNodes(nodes);
  }

  <span class="comment">// set edges</span>
  <span class="reserved">if</span> (edges != null) {
    <span class="comment">// initialize</span>
    <span class="reserved">this</span>.initEdges(edges);
  }
}

<span class="comment">// Network:initNodes</span>
<span class="comment">// initializes a list of nodes using the array input</span>
<span class="comment">// nodes should have three fields:  name, xcoord, ycoord</span>
<span class="reserved">function</span> initNodes(nodeArray) {
  <span class="comment">// save</span>
  <span class="reserved">this</span>.nodes = nodeArray;

  <span class="comment">// Scale factors for embedding these nodes in Google Maps worldspace</span>
  var xscale_factor = 1;
  var yscale_factor = 1;
  var latlng_pad = 0.1;

  <span class="reserved">for</span> (i = 0; i &lt; nodeArray.length; i++) {
    <span class="comment">// find the lat/lng bounds for this object</span>
    var swBound = new google.maps.LatLng(nodeArray[i].xcoord*xscale_factor, nodeArray[i].ycoord*yscale_factor);
    var neBound = new google.maps.LatLng(nodeArray[i].xcoord*xscale_factor+latlng_pad, nodeArray[i].ycoord*yscale_factor+latlng_pad);

    var bounds = new google.maps.LatLngBounds(swBound, neBound);
    <span class="comment">//var curNode = new c_ImageOverlay(bounds, "images/author_node.png", this.imgmap, i, nodeArray[i].name, "images/author_node_select.png", "images/author_node_source.png", "images/author_node_dest.png");</span>
    var image = new google.maps.MarkerImage(<span class="literal">"author_node_dest.png"</span>, new google.maps.Size(8,8), new google.maps.Point(0,0));

    var curNode = new google.maps.Marker({position: swBound, icon: image, map: <span class="reserved">this</span>.imgmap, title: nodeArray[i].name});

    <span class="comment">// add nodes to array</span>
    <span class="reserved">this</span>.Nodes.push(curNode);
  }
}

<span class="comment">// Network:initEdges</span>
<span class="comment">// Initializes this Network's edges using edge array input</span>
<span class="comment">// Each input edge should have values 'from' and 'to' as indices indicating which</span>
<span class="comment">// nodes are connected by this edge (using the ordering of the input nodes)</span>
<span class="comment">// and may include an optional 'weight'</span>
<span class="reserved">function</span> initEdges(edgeArray) {
  <span class="comment">// store the original edges</span>
  <span class="reserved">this</span>.edges = edgeArray;

  <span class="comment">// options for how to draw edges</span>
  var edgeOpts = {
    <span class="comment">//strokeColor: "#FF0000",</span>
    strokeOpacity: 0.5,
    <span class="comment">//strokeWeight: 2,</span>
    clickable: false,
    zIndex: 0 
  };

  <span class="comment">// go through each edge, find corresponding nodes, get their LatLng coords and</span>
  <span class="comment">// use these to set the path of the edge</span>
  <span class="reserved">for</span> (i=0; i &lt; edgeArray.length; i++) {
    from_idx = edgeArray[i].from;
    to_idx = edgeArray[i].to;

    var weight = 1;

    <span class="reserved">if</span> (edgeArray[i].weight != undefined) {
      weight = edgeArray[i].weight;
    }

    <span class="comment">// map this weight to a color between blue (low) and red (high)</span>
    <span class="comment">/*
    red = Math.pow(weight,0.5);
    if (weight &lt; 0.5) {
      red = 0;
    }
    //green = -2*Math.pow(weight-0.5,2)+0.5;
    green = Math.pow(weight,0.25);
    if (weight &lt; 0.35 || weight &gt; 0.65) {
      green = 0;
    }
    blue = Math.pow(weight-1,2);
    if (weight &gt; 0.5) {
      blue = 0;
    }
    */</span>
    red = weight;
    green = 0;
    blue = 1-weight;
    color = rgb2hex8(red,green,blue);

    edgeOpts[<span class="literal">'strokeColor'</span>] = <span class="literal">'#'</span> + color;
    var line_weight = 10 * weight;
    <span class="reserved">if</span> (line_weight &lt; 1) {
      line_weight = 1;
    }

    edgeOpts[<span class="literal">'strokeWeight'</span>] = line_weight;

    edge = new google.maps.Polyline(edgeOpts);

    <span class="comment">// set path and map</span>
    from_bound = <span class="reserved">this</span>.Nodes[from_idx].getPosition();
    to_bound = <span class="reserved">this</span>.Nodes[to_idx].getPosition();

    edge.setPath(Array(from_bound, to_bound));
    edge.setMap(<span class="reserved">this</span>.imgmap);

    <span class="comment">// add edge to array</span>
    <span class="reserved">this</span>.Edges.push(edge);
  }
}

<span class="comment">// Network:updateEdges</span>
<span class="comment">// Updates the current edge array with the edges in the input array</span>
<span class="comment">// Assumes numerical edge indices correspond to the order of nodes in the node array</span>
<span class="reserved">function</span> updateEdges(edgeArray) {
  <span class="comment">// clear old edges</span>
  <span class="reserved">for</span> (i = 0; i &lt; <span class="reserved">this</span>.Edges.length; i++) {
    <span class="reserved">this</span>.Edges[i].setMap(null);
  }

  <span class="reserved">this</span>.Edges = new Array();

  <span class="comment">// add new edges</span>
  <span class="reserved">this</span>.initEdges(edgeArray);
}

<span class="comment">// Network:initialize</span>
<span class="comment">// create a new map</span>
<span class="reserved">function</span> initialize() {
  <span class="comment">//var my_img_map = new google.maps.LatLng(40,-95);</span>

  var myImgOptions = {
    <span class="comment">//backgroundColor: "#3f668a",</span>
    backgroundColor: <span class="literal">"#dddddd"</span>,
    zoom: 4,
    disableDoubleClickZoom: 0,
    scrollwheel: 0,
    center: new google.maps.LatLng(50,-115),
    mapTypeControlOptions: {
      <span class="comment">//mapTypeIds: []</span>
      mapTypeIds: [google.maps.MapTypeId.ROADMAP]
        <span class="comment">// google.maps.MapTypeId.ROADMAP]</span>
      },
    mapTypeControl: false
    };

  <span class="reserved">this</span>.imgmap = new google.maps.Map(document.getElementById(<span class="reserved">this</span>.div_id), myImgOptions);

  <span class="comment">// set the map type to use</span>
  <span class="reserved">this</span>.imgmap.setMapTypeId(google.maps.MapTypeId.ROADMAP);
  
  <span class="comment">// insert any additional control elements</span>

  <span class="reserved">this</span>.imgmap.controls[google.maps.ControlPosition.TOP_RIGHT].insertAt(0, createRadioButtonControlDiv(<span class="literal">'Sparse'</span>, <span class="literal">'sparse'</span>, true, <span class="literal">'update_network_edges(airline_nodes)'</span>));
  <span class="reserved">this</span>.imgmap.controls[google.maps.ControlPosition.TOP_RIGHT].insertAt(0, createRadioButtonControlDiv(<span class="literal">'Mid'</span>, <span class="literal">'sparse'</span>, false, <span class="literal">'update_network_edges(airline_nodes_mid)'</span>));
  <span class="reserved">this</span>.imgmap.controls[google.maps.ControlPosition.TOP_RIGHT].insertAt(0, createRadioButtonControlDiv(<span class="literal">'Dense'</span>, <span class="literal">'sparse'</span>, false, <span class="literal">'update_network_edges(airline_nodes_dense)'</span>));
  <span class="reserved">this</span>.imgmap.controls[google.maps.ControlPosition.TOP_RIGHT].insertAt(0, createRadioButtonControlDiv(<span class="literal">'Global'</span>, <span class="literal">'sparse'</span>, false, <span class="literal">'update_network_edges(airline_nodes_global)'</span>));
  <span class="reserved">this</span>.imgmap.controls[google.maps.ControlPosition.TOP_RIGHT].insertAt(0, createCheckboxControlDiv(<span class="literal">"Show nodes"</span>, false, <span class="literal">"showNetworkNodes(this.checked);"</span>));
  <span class="reserved">this</span>.imgmap.controls[google.maps.ControlPosition.RIGHT].insertAt(0, createTextDiv(<span class="literal">""</span>, <span class="literal">"num_edges"</span>));
} 

<span class="comment">// Network:showNodes</span>
<span class="comment">// Show the nodes in this network</span>
<span class="reserved">function</span> showNodes() {
  <span class="reserved">for</span> (i=0; i &lt; <span class="reserved">this</span>.Nodes.length; i++) {
    <span class="reserved">this</span>.Nodes[i].setVisible(true);
  }
}

<span class="comment">// Network:hideNodes</span>
<span class="comment">// Hide the nodes in this network</span>
<span class="reserved">function</span> hideNodes() {
  <span class="reserved">for</span> (i=0; i &lt; <span class="reserved">this</span>.Nodes.length; i++) {
    <span class="reserved">this</span>.Nodes[i].setVisible(false);
  }
}

<span class="comment">// Network object</span>
var net;

<span class="reserved">function</span> create_network(node_edge_obj) {
  net = new Network(<span class="literal">"map_field"</span>, node_edge_obj.nodes, node_edge_obj.edges);
  showNetworkNodes(false);

  <span class="comment">// write the number of edges in the network </span>
  <span class="comment">//var text_div = document.getElementById("num_edges");</span>
  var text_div = net.imgmap.controls[google.maps.ControlPosition.RIGHT].getAt(0);
  text_div.innerHTML = <span class="literal">"Number of edges: "</span> + net.Edges.length;
  <span class="comment">//update_text();</span>
}

<span class="reserved">function</span> update_text() {
  var text_div = document.getElementById(<span class="literal">"num_edges"</span>);
  text_div.innerHTML = <span class="literal">"Number of edges: "</span> + net.Edges.length;
}

<span class="reserved">function</span> update_network_edges(node_edge_obj) {
  <span class="comment">// grab the edges</span>
  var edges = node_edge_obj.edges;

  <span class="comment">// now update the network</span>
  net.updateEdges(edges);
 
  <span class="comment">// write the number of edges in the network </span>
  var text_div = document.getElementById(<span class="literal">"num_edges"</span>);

  text_div.innerHTML = <span class="literal">"Number of edges: "</span> + net.Edges.length;
}

<span class="comment">// initializes a list of overlay nodes using the array input</span>
<span class="comment">// nodes should have three fields:  name, xcoord, ycoord</span>
<span class="reserved">function</span> initAuthorNodes(nodeArray) {
  <span class="comment">// amount by which to scale the coordinates to map them into Google Maps space</span>
  var xscale_factor = 85;
  var yscale_factor = 175;
  <span class="comment">// amount to pad coordinates to generate box</span>
  var latlng_pad = 0.3;

  <span class="comment">//document.getElementById("text_debug").value = "";</span>
  <span class="reserved">for</span> (i = 0; i &lt; nodeArray.length; i++) {
    <span class="comment">// create a new overlay object (of correct type(s))</span>
    var swBound = new google.maps.LatLng(nodeArray[i].xcoord*xscale_factor, nodeArray[i].ycoord*yscale_factor);
    var neBound = new google.maps.LatLng(nodeArray[i].xcoord*xscale_factor+latlng_pad, nodeArray[i].ycoord*yscale_factor+latlng_pad);
    <span class="comment">//var swBound = new google.maps.LatLng(15, 15);</span>
    var bounds = new google.maps.LatLngBounds(swBound, neBound);
    <span class="comment">//document.getElementById("test_div").innerHTML = nodeArray[i].name;</span>
    <span class="comment">//var bounds = new google.maps.LatLngBounds(swBound, neBound);</span>
    <span class="comment">//var overlayNode = new c_TextOverlay(bounds, nodeArray[i].name, imgmap);</span>
    <span class="reserved">if</span> (nodeArray[i].name != <span class="literal">"You"</span>) {
    var imageNode = new c_ImageOverlay(bounds, <span class="literal">"images/author_node.png"</span>, imgmap, i, nodeArray[i].name, <span class="literal">"images/author_node_select.png"</span>, <span class="literal">"images/author_node_source.png"</span>, <span class="literal">"images/author_node_dest.png"</span>);
    }
    <span class="comment">// if this node is the "You" node...</span>
    <span class="reserved">else</span> {
      var imageNode = new c_ImageOverlay(bounds, <span class="literal">"images/author_node_you.png"</span>, imgmap, i, nodeArray[i].name, <span class="literal">"images/author_node_select.png"</span>, <span class="literal">"images/author_node_source.png"</span>, <span class="literal">"images/author_node_dest.png"</span>);
    }
    <span class="comment">//document.getElementById("text_debug").value += nodeArray[i].name + " " + nodeArray[i].xcoord + " ";</span>
    <span class="comment">//document.getElementById("text_debug").value += nodeArray[i].ycoord+ " " + bounds + "\n";</span>

    authorNodes.push(imageNode);
    authorNames.push(nodeArray[i].name);
    <span class="comment">//nameOverlays.push(overlayNode);</span>
  }
}

<span class="comment">/*** CUSTOM IMAGE OVERLAY TYPE (c_ImageOverlay) + OPTIONS ****/</span>
<span class="comment">// ...with help from Google Maps API v3 tutorial (thanks!)</span>
<span class="comment">// constructor</span>
<span class="reserved">function</span> c_ImageOverlay(bounds, image, map, idx, text, select_image, source_image, dest_image) {
  <span class="comment">// init</span>
  <span class="reserved">this</span>.bounds_ = bounds;
  <span class="reserved">this</span>.image_ = image;
  <span class="reserved">this</span>.map_ = map;
  <span class="reserved">this</span>.idx_ = idx;
  <span class="reserved">this</span>.select_image_ = select_image;
  <span class="reserved">this</span>.source_image_ = source_image;
  <span class="reserved">this</span>.dest_image_ = dest_image;

  <span class="reserved">this</span>.div_ = null;
  <span class="reserved">this</span>.text_ = text;
  <span class="reserved">this</span>.text_div_ = null;
  <span class="reserved">this</span>.info_box_div_ = null;
  <span class="reserved">this</span>.info_box_open_ = false;

  <span class="reserved">this</span>.setMap(map);
}

<span class="comment">// sub-class</span>
c_ImageOverlay.<span class="reserved">prototype</span> = new google.maps.OverlayView();

<span class="comment">// onAdd function</span>
c_ImageOverlay.<span class="reserved">prototype</span>.onAdd = <span class="reserved">function</span>() {
  <span class="comment">// create the div elt</span>
  var div = document.createElement(<span class="literal">"DIV"</span>);
  <span class="comment">// border stuff here really just for testing</span>
  div.style.border = <span class="literal">"none"</span>;
  div.style.position = <span class="literal">"absolute"</span>;

  <span class="comment">// anchor for linking to events</span>
  var a = document.createElement(<span class="literal">"A"</span>);
  a.href = <span class="literal">"#"</span>;
  a.onclick = new Function(<span class="literal">""</span>, <span class="literal">"return registerNodeClick("</span> + <span class="reserved">this</span>.idx_ + <span class="literal">");"</span>);

  var img = document.createElement(<span class="literal">"img"</span>);
  img.id = <span class="literal">"img"</span> + <span class="reserved">this</span>.idx_;
  img.src = <span class="reserved">this</span>.image_;
  img.style.width=<span class="literal">"100%"</span>;
  img.style.height=<span class="literal">"100%"</span>;
  img.style.zIndex = <span class="literal">"1"</span>;
  img.style.marginLeft = <span class="literal">"0px"</span>;
  img.style.marginTop = <span class="literal">"0px"</span>;
  img.style.position = <span class="literal">"absolute"</span>;

  a.appendChild(img);
  div.appendChild(a);

  var text_div = document.createElement(<span class="literal">"DIV"</span>);
  text_div.style.position = <span class="literal">"relative"</span>;
  text_div.style.marginLeft = <span class="literal">"97%"</span>;
  text_div.style.marginTop = <span class="literal">"25%"</span>;
  text_div.style.width = <span class="literal">"100px"</span>;
  text_div.style.zIndex = <span class="literal">"-1"</span>;
  text_div.style.display = <span class="literal">""</span>;
  <span class="comment">//text_div.onclick = new Function("", "return registerNodeClick(" + this.idx_ + ");");</span>
  text_div.innerHTML = <span class="reserved">this</span>.text_; 

  <span class="reserved">this</span>.text_div_ = text_div;

  div.appendChild(<span class="reserved">this</span>.text_div_);
  <span class="reserved">this</span>.info_box_div_ = createInfoBox();
  div.appendChild(<span class="reserved">this</span>.info_box_div_);

  <span class="comment">//div.innerHTML = "&lt;a href='#' onclick='alert(" + this.idx_ + "); return false'&gt;&lt;img src='" + this.image_ + "' border='0'&gt;&lt;/a&gt;";</span>

  <span class="comment">// set the div</span>
  <span class="reserved">this</span>.div_ = div;

  <span class="comment">// place this in one of the map's panes</span>
  var panes = <span class="reserved">this</span>.getPanes();
  panes.overlayImage.appendChild(div);
}

<span class="comment">// hides text</span>
c_ImageOverlay.<span class="reserved">prototype</span>.hideText = <span class="reserved">function</span>() {
  <span class="reserved">this</span>.text_div_.style.display = <span class="literal">"none"</span>;
}
<span class="comment">// shows text</span>
c_ImageOverlay.<span class="reserved">prototype</span>.showText = <span class="reserved">function</span>() {
  <span class="reserved">this</span>.text_div_.style.display = <span class="literal">""</span>; 
}

<span class="comment">// image reset function</span>
c_ImageOverlay.<span class="reserved">prototype</span>.resetImage = <span class="reserved">function</span>() {
  <span class="reserved">this</span>.div_.getElementsByTagName(<span class="literal">"img"</span>)[0].src = <span class="reserved">this</span>.image_;
}

<span class="comment">// select image set function</span>
c_ImageOverlay.<span class="reserved">prototype</span>.setSelectImage = <span class="reserved">function</span>() {
  <span class="reserved">this</span>.div_.getElementsByTagName(<span class="literal">"img"</span>)[0].src = <span class="reserved">this</span>.select_image_;
}

<span class="comment">// set source image function</span>
c_ImageOverlay.<span class="reserved">prototype</span>.setSourceImage = <span class="reserved">function</span>() {
  <span class="reserved">this</span>.div_.getElementsByTagName(<span class="literal">"img"</span>)[0].src = <span class="reserved">this</span>.source_image_;
}

<span class="comment">// set destination image function</span>
c_ImageOverlay.<span class="reserved">prototype</span>.setDestImage = <span class="reserved">function</span>() {
  <span class="reserved">this</span>.div_.getElementsByTagName(<span class="literal">"img"</span>)[0].src = <span class="reserved">this</span>.dest_image_;
}

<span class="comment">// Shows a node-based info box</span>
c_ImageOverlay.<span class="reserved">prototype</span>.toggleInfoBox = <span class="reserved">function</span>() {
  <span class="reserved">if</span> (!<span class="reserved">this</span>.info_box_open_) {
    <span class="reserved">this</span>.openInfoBox();
    <span class="reserved">this</span>.setSelectImage();
    <span class="reserved">this</span>.info_box_open_ = true;
  }
  <span class="reserved">else</span> {
    <span class="comment">//this.info_box_div_.display = "none";</span>
    <span class="reserved">this</span>.closeInfoBox();
    <span class="reserved">this</span>.resetImage();
    <span class="reserved">this</span>.info_box_open_ = false;
  }
}

<span class="comment">// opens an info box</span>
c_ImageOverlay.<span class="reserved">prototype</span>.openInfoBox = <span class="reserved">function</span>() {
  var idx = <span class="reserved">this</span>.idx_;
  <span class="comment">// quick check to make sure that if we're going to open this info box, then</span>
  <span class="comment">// its corresponding anchor should be showing</span>
  <span class="comment">//document.getElementById("name_field").childNodes[rank_idx].style.display = "";</span>

  var cur_div = <span class="reserved">this</span>.info_box_div_;

  <span class="reserved">if</span> (cur_div.style.visibility == <span class="literal">"hidden"</span>) {
    var height = 145;
    <span class="comment">// get neighbors</span>
    var nbrs = getNodeNeighbors(idx);
    <span class="comment">// clear the current div </span>
    cur_div.innerHTML = <span class="literal">""</span>;
    <span class="comment">// set anchor click fn</span>
    var onclick_fn = <span class="literal">"centerMap(imgmap, authorNodes["</span> + idx  + <span class="literal">"].getCenter()); return false;"</span>;

    <span class="comment">// padding space + text</span>
    var p = document.createElement(<span class="literal">"P"</span>);
    <span class="comment">//p.style.font = "16pt Helvetica #3d3d3d";</span>
    p.style.fontSize = <span class="literal">"12pt"</span>;
    p.style.fontWeight = <span class="literal">"bold"</span>;
    p.style.paddingBottom = <span class="literal">"0px"</span>;
    p.innerHTML = authorNames[idx];
    cur_div.appendChild(p);

    var p2 = document.createElement(<span class="literal">"P"</span>);
    p2.style.paddingBottom = <span class="literal">"0px"</span>;
    p2.innerHTML = <span class="literal">"Neighbors:"</span>;
    cur_div.appendChild(p2);

    <span class="comment">// now write in neighbors</span>
    <span class="reserved">for</span> (i=0; i &lt; nbrs.length; i++) {
      <span class="comment">//var a = createAnchorControlDiv("", authorNames[nbrs[i]], "#", "authorNodes[" + idx + "].toggleInfoBox(); authorNodes[" + nbrs[i] + "].toggleInfoBox();");</span>
      var a = createAnchorControlDiv(<span class="literal">""</span>, authorNames[nbrs[i]], <span class="literal">"#"</span>, <span class="literal">"registerNodeClick("</span> + nbrs[i] + <span class="literal">");"</span>);
      a.id = <span class="literal">"info_sub_link_sub2"</span>;
      cur_div.appendChild(a);
      height += 15;
    }

    cur_div.innerHTML += <span class="literal">"&lt;br&gt;"</span>;

    <span class="comment">// add buttons</span>
    <span class="comment">// center map</span>
    cur_div.innerHTML += <span class="literal">"&lt;a href='#' id='info_sub_link' onclick='"</span> + onclick_fn + <span class="literal">"'&gt;&lt;img src='images/center_button.png' border='0'&gt;&lt;/a&gt;"</span>;
    <span class="comment">// more info</span>
    <span class="comment">/*
    cur_div.innerHTML += "&lt;a href='http://en.wikipedia.org/w/index.php?search=" + authorNames[idx] + "' target='_blank'&gt;&lt;img src='images/more_info_button.png' border='0'&gt;&lt;/a&gt;";
    */</span>
    
    <span class="comment">// a little 'close' anchor:</span>
    cur_div.innerHTML += <span class="literal">"&lt;br&gt;"</span>;
    cur_div.innerHTML += <span class="literal">"&lt;a id='info_sub_link_sub' href='#' onclick='return registerNodeClick("</span> + idx + <span class="literal">");'&gt;[x] close&lt;/a&gt;"</span>;
    <span class="comment">//onclick='authorNodes[" + idx + "].toggleInfoBox(); return false;'&gt;[x] close&lt;/a&gt;";</span>

    <span class="comment">// set div style params</span>
    cur_div.style.visibility = <span class="literal">"visible"</span>;
    cur_div.style.display = <span class="literal">""</span>;
    cur_div.style.height = height+<span class="literal">"px"</span>;
    <span class="comment">//cur_div.style.width = "270px";</span>
    <span class="comment">// make variable width</span>
    var width = p.innerHTML.length * 10;
    <span class="reserved">if</span> (width &lt; 235) {
      width = 235;
    }
    <span class="comment">//set width</span>
    cur_div.style.width = width + <span class="literal">"px"</span>;
    cur_div.style.paddingLeft = <span class="literal">"7px"</span>;
    <span class="comment">//cur_div.style.paddingTop = "5px";</span>
    cur_div.style.marginLeft = <span class="literal">"15px"</span>;
    cur_div.style.marginRight = <span class="literal">"auto"</span>;
    cur_div.style.marginTop = <span class="literal">"15px"</span>;
    cur_div.style.marginBottom = <span class="literal">"5px"</span>;
    cur_div.style.border = <span class="literal">"1px solid black"</span>;
    cur_div.style.backgroundColor = <span class="literal">"#ffffff"</span>;
  }
}

<span class="comment">// closes an info box</span>
c_ImageOverlay.<span class="reserved">prototype</span>.closeInfoBox = <span class="reserved">function</span>() {
  cur_div = <span class="reserved">this</span>.info_box_div_;

  cur_div.style.visibility = <span class="literal">"hidden"</span>;
  cur_div.style.marginTop = <span class="literal">"0px"</span>;
  cur_div.style.marginBottom = <span class="literal">"0px"</span>;
  cur_div.style.height = <span class="literal">"0px"</span>;
}

<span class="comment">// draw function</span>
c_ImageOverlay.<span class="reserved">prototype</span>.draw = <span class="reserved">function</span>() {
  var overlayProjection = <span class="reserved">this</span>.getProjection();

  var sw = overlayProjection.fromLatLngToDivPixel(<span class="reserved">this</span>.bounds_.getSouthWest());
  var ne = overlayProjection.fromLatLngToDivPixel(<span class="reserved">this</span>.bounds_.getNorthEast());

  var div = <span class="reserved">this</span>.div_;
  div.style.left = sw.x + <span class="literal">'px'</span>;
  div.style.top = ne.y + <span class="literal">'px'</span>;
  
  <span class="comment">// calculate width/height</span>
  var width = (ne.x - sw.x);
  var height = (ne.y - sw.y);

  <span class="comment">// correct if minimum width/height not reached</span>
  
  <span class="comment">// equality check to make div square; set to max</span>
  <span class="reserved">if</span> (width != height) {
    width = Math.max(width, height);
    height = width;
  }

  <span class="comment">// correct if minimum width not reached</span>
  <span class="reserved">if</span> (width &lt; 16) {
    width = 16;
    height = 16;
  }

  <span class="comment">// correct if maximum width/height reached</span>
  <span class="reserved">if</span> (width &gt; 128) {
    width = 128;
    height = 128;
  }

  div.style.width = width + <span class="literal">'px'</span>;
  div.style.height = height + <span class="literal">'px'</span>;

  <span class="comment">// TESTESTEST added 7/2/10 -- see if we can place the div right on top of the</span>
  <span class="comment">// upper-right-hand corner in order to place it over the point of any edges connecting</span>
  <span class="comment">// this node to others</span>
  div.style.top = ne.y - (height/2);
  div.style.left = ne.x - (width/2);

  <span class="comment">// some debug output</span>
  <span class="comment">//document.getElementById("test_div").innerHTML = div.style.left + " " + div.style.top + " " + div.style.width + " " + div.style.height + " " + this.bounds_ + " " + ne.x + " " + sw.y;</span>
}

<span class="comment">// onRemove function</span>
c_ImageOverlay.<span class="reserved">prototype</span>.onRemove = <span class="reserved">function</span>() {
  <span class="reserved">this</span>.div_.parentNode.removeChild(<span class="reserved">this</span>.div_);
  <span class="reserved">this</span>.div_ = null;
}

<span class="comment">// HIDING AND SHOWING this overlay type</span>
c_ImageOverlay.<span class="reserved">prototype</span>.hide = genericHide;
c_ImageOverlay.<span class="reserved">prototype</span>.show = genericShow;
c_ImageOverlay.<span class="reserved">prototype</span>.getCenter = genericGetCenter;

<span class="comment">/**** CUSTOM TEXT OVERLAY TYPE (c_TextOverlay) + OPTIONS ****/</span>
<span class="comment">// ...with help from Google Maps API v3 tutorial (thanks!)</span>
<span class="comment">// constructor</span>
<span class="reserved">function</span> c_TextOverlay(bounds, text, map) {
  <span class="comment">// Initialize properties</span>
  <span class="reserved">this</span>.bounds_ = bounds;
  <span class="reserved">this</span>.text_ = text;
  <span class="comment">//this.text_ = text;</span>
  <span class="reserved">this</span>.map_ = map;

  <span class="comment">// set this onAdd</span>
  <span class="reserved">this</span>.div_ = null;

  <span class="reserved">this</span>.setMap(map);
}

<span class="comment">// sub-class this!</span>
c_TextOverlay.<span class="reserved">prototype</span> = new google.maps.OverlayView();

<span class="comment">// onAdd function</span>
c_TextOverlay.<span class="reserved">prototype</span>.onAdd = <span class="reserved">function</span>() {
  <span class="comment">// create the div elt</span>
  var div = document.createElement(<span class="literal">"DIV"</span>);
  <span class="comment">// border stuff here really just for testing</span>
  div.style.border = <span class="literal">"none"</span>;
  <span class="comment">//div.style.border = "black solid";</span>
  <span class="comment">//div.style.borderWidth = "2px";</span>
  div.style.position = <span class="literal">"absolute"</span>;

  <span class="comment">// just use the text we stored</span>
  div.innerHTML = <span class="reserved">this</span>.text_;

  <span class="comment">// set the div</span>
  <span class="reserved">this</span>.div_ = div;

  <span class="comment">// place this in one of the map's panes</span>
  var panes = <span class="reserved">this</span>.getPanes();
  panes.overlayShadow.appendChild(div);
}

<span class="comment">// draw function</span>
c_TextOverlay.<span class="reserved">prototype</span>.draw = <span class="reserved">function</span>() {
  var overlayProjection = <span class="reserved">this</span>.getProjection();

  var sw = overlayProjection.fromLatLngToDivPixel(<span class="reserved">this</span>.bounds_.getSouthWest());
  var ne = overlayProjection.fromLatLngToDivPixel(<span class="reserved">this</span>.bounds_.getNorthEast());

  var div = <span class="reserved">this</span>.div_;
  div.style.left = sw.x + <span class="literal">'px'</span>;
  div.style.top = ne.y + <span class="literal">'px'</span>;

  <span class="comment">// calculate width and height</span>
  var width = (ne.x - sw.x);
  var height = (ne.y - sw.y);

  <span class="comment">// equality check to make div square; set to max</span>
  <span class="reserved">if</span> (width != height) {
    width = Math.max(width, height);
    height = width;
  }

  div.style.width = width + <span class="literal">'px'</span>;
  div.style.height = height + <span class="literal">'px'</span>;
  
  <span class="comment">// some debug output</span>
  <span class="comment">//document.getElementById("test_div").innerHTML = div.style.left + " " + div.style.top + " " + div.style.width + " " + div.style.height + " " + this.bounds_ + " " + ne.x + " " + sw.y;</span>
}

<span class="comment">// onRemove function</span>
c_TextOverlay.<span class="reserved">prototype</span>.onRemove = <span class="reserved">function</span>() {
  <span class="reserved">this</span>.div_.parentNode.removeChild(<span class="reserved">this</span>.div_);
  <span class="reserved">this</span>.div_ = null;
}

<span class="comment">// HIDING AND SHOWING this overlay type</span>
c_TextOverlay.<span class="reserved">prototype</span>.hide = genericHide;
c_TextOverlay.<span class="reserved">prototype</span>.show = genericShow;

<span class="reserved">function</span> genericHide() {
  <span class="comment">// if this evaluates to false, then the div doesn't even exist (i.e., is null)</span>
  <span class="reserved">if</span> (<span class="reserved">this</span>.div_) {
    <span class="reserved">this</span>.div_.style.visibility = <span class="literal">"hidden"</span>;
  }
}

<span class="reserved">function</span> genericShow() {
  <span class="reserved">if</span> (<span class="reserved">this</span>.div_) {
    <span class="reserved">this</span>.div_.style.visibility = <span class="literal">"visible"</span>;
  }
}

<span class="comment">// generic getter for bounds center</span>
<span class="reserved">function</span> genericGetCenter() {
  <span class="reserved">if</span> (<span class="reserved">this</span>.bounds_) {
    <span class="comment">//return this.bounds_.getCenter();</span>
    <span class="reserved">return</span> <span class="reserved">this</span>.bounds_.getNorthEast();
  }
}

<span class="comment">/**** CUSTOM OVERLAY MAP TYPE (c_OverlayMapType) + OPTIONS ****/</span>
<span class="comment">// Displays author names in correct positions as overlays on top of map</span>
<span class="comment">// Created with assistance from Google Maps API V3 Tutorials</span>
<span class="reserved">function</span> c_OverlayMapType(tileSize) {
  <span class="reserved">this</span>.tileSize = tileSize;
}

c_OverlayMapType.<span class="reserved">prototype</span>.getTile = <span class="reserved">function</span>(coord, zoom, ownerDocument) {
  var div = ownerDocument.createElement(<span class="literal">"DIV"</span>);
  div.innerHTML = coord;
  div.style.width = <span class="reserved">this</span>.tileSize.width + <span class="literal">'px'</span>;
  div.style.height = <span class="reserved">this</span>.tileSize.height + <span class="literal">'px'</span>;
  div.style.fontSize = <span class="literal">'10'</span>;
  div.style.borderStyle = <span class="literal">'solid'</span>;
  div.style.borderWidth = <span class="literal">'1px'</span>;
  div.style.borderColor = <span class="literal">'#AAAAAA'</span>;
  <span class="reserved">return</span> div;
}

c_OverlayMapType.<span class="reserved">prototype</span>.name = <span class="literal">"Name overlay"</span>;
c_OverlayMapType.<span class="reserved">prototype</span>.alt = <span class="literal">"Display author names"</span>;

<span class="comment">/**** IMAGE MAP TYPE (c_ImageMapType) + OPTIONS ****/</span>
<span class="comment">// c_ImageMapTypeOptions </span>
var c_ImageMapTypeOptions = {
  getTileUrl: <span class="reserved">function</span>(coord, zoom) {
    <span class="comment">//return "http://austin.cs.dartmouth.edu/wlm/images/tbox.png";</span>
    <span class="comment">//return "http://mt3.google.com/mapstt?" +</span>
    <span class="comment">//"zoom=" + zoom + "&amp;x=" + coord.x + "&amp;y=" + coord.y + "&amp;client=google";</span>
    <span class="comment">//return "http://austin.cs.dartmouth.edu/wlm/images/write_like_me_logo_new_CROP.png";</span>
    <span class="comment">//rx = coord.x;</span>
    <span class="comment">//ry = coord.y;</span>
    <span class="comment">//rxnew = Math.pow(2,zoom)-Math.abs(rx) % Math.pow(2,zoom)-1;</span>
    <span class="comment">//rynew = Math.pow(2,zoom)-Math.abs(ry) % Math.pow(2,zoom)-1;</span>
    <span class="comment">//rx = Math.abs(rx) % Math.pow(2,zoom)-1;</span>
    <span class="comment">//ry = Math.abs(ry) % Math.pow(2,zoom)-1;</span>
    <span class="comment">//imgname = zoom.toString() + "_" + rx + "_" + ry + ".png";</span>
    <span class="comment">//imgnamenew = zoom.toString() + "_" + rxnew + "_" + rynew + ".png";</span>
    <span class="comment">//document.getElementById("test_div").innerHTML = imgnamenew;</span>
    <span class="comment">//imgname = zoom.toString() + "_" + coord.x.toString() + "_" + coord.y.toString() + ".png";</span>
    imgname = <span class="literal">"tbox.png"</span>;
    
    url = <span class="literal">"http://austin.cs.dartmouth.edu/wlm/"</span> + img_dir + imgname;
    
    <span class="reserved">return</span> url;
  },
  tileSize: new google.maps.Size(512,512),
  isPng: true,
  minZoom: 2,
  maxZoom: 16,
  name: <span class="literal">'Style network'</span>,
  alt: <span class="literal">'Your author style network'</span>
};

var c_ImageMapType = new google.maps.ImageMapType(c_ImageMapTypeOptions);

<span class="comment">// set class properties</span>

<span class="comment">/****/</span>

<span class="comment">// Map object</span>
var imgmap;

<span class="comment">// Any overlay objects </span>
var marker;
var nameOverlays = new Array();
<span class="comment">// just for storing author nodes</span>
var authorNodes = new Array();
<span class="comment">// stores author node names in order of authorNames</span>
var authorNames = new Array();
<span class="comment">// stores indices for author rankings rank:orig_idx</span>
var authorRanking = new Array();
<span class="comment">// stores indices for original indices to rankings (i.e., orig_idx:rank)</span>
var authorIdxToRank = new Array();
<span class="comment">// just stores the indices in order for quick access</span>
var allIdx = new Array();
<span class="comment">// just for storing edges (eventually will be array of google.maps.Polyline type)</span>
var authorEdges = new Array();
<span class="comment">// stores the original edges (w/ from/to idx)</span>
var origEdges = new Array();
<span class="comment">// stores current shortest path edge indices (grabs edges in authorEdges/origEdges)</span>
var curShortestPathEdgeIdx = new Array();

<span class="comment">// create a new map</span>
<span class="comment">// and (possibly) specify a new image directory</span>
<span class="reserved">function</span> initialize_old(uimg_dir) {
  <span class="comment">// set global image directory</span>
  <span class="reserved">if</span> (uimg_dir != null) {
    img_dir = uimg_dir;
  }

  var my_img_map = new google.maps.LatLng(45,90);

  var myImgOptions = {
    <span class="comment">//backgroundColor: "#3f668a",</span>
    backgroundColor: <span class="literal">"#dddddd"</span>,
    zoom: 1,
    disableDoubleClickZoom: 1,
    center: my_img_map,
    mapTypeControlOptions: {
      <span class="comment">//mapTypeIds: []</span>
      mapTypeIds: [<span class="literal">'custom'</span> , google.maps.MapTypeId.ROADMAP]
        <span class="comment">// google.maps.MapTypeId.ROADMAP]</span>
      },
    mapTypeControl: false
    };

  imgmap = new google.maps.Map(document.getElementById(<span class="literal">"map_field"</span>), myImgOptions);

  imgmap.mapTypes.set(<span class="literal">'custom'</span>, c_ImageMapType);

  <span class="comment">// insert overlay map type</span>
  <span class="comment">//imgmap.overlayMapTypes.insertAt(0, new c_OverlayMapType(c_ImageMapType.tileSize));</span>

  <span class="comment">// set the map type to use</span>
  imgmap.setMapTypeId(<span class="literal">'custom'</span>);
  
  <span class="comment">// insert any additional control elements</span>
  imgmap.controls[google.maps.ControlPosition.TOP_RIGHT].insertAt(0, createCheckboxControlDiv(<span class="literal">"Show nodes"</span>, true, <span class="literal">"showNetworkNodes(this.checked);"</span>));

  <span class="comment">// Update the current objects</span>
  <span class="reserved">for</span> (i = 0; i &lt; nameOverlays.length; i++) {
    nameOverlays[i].setMap(imgmap);
  }
  <span class="reserved">for</span> (i=0; i &lt; authorNodes.length; i++) {
    authorNodes[i].setMap(imgmap);
  }
  <span class="reserved">for</span> (i=0; i &lt; authorEdges.length; i++) {
    authorEdges[i].setMap(imgmap);
  }
} 

<span class="comment">// initializes a list of overlay nodes using the array input</span>
<span class="comment">// nodes should have three fields:  name, xcoord, ycoord</span>
<span class="reserved">function</span> initAuthorNodes(nodeArray) {
  <span class="comment">// amount by which to scale the coordinates to map them into Google Maps space</span>
  var xscale_factor = 85;
  var yscale_factor = 175;
  <span class="comment">// amount to pad coordinates to generate box</span>
  var latlng_pad = 0.3;

  <span class="comment">//document.getElementById("text_debug").value = "";</span>
  <span class="reserved">for</span> (i = 0; i &lt; nodeArray.length; i++) {
    <span class="comment">// create a new overlay object (of correct type(s))</span>
    var swBound = new google.maps.LatLng(nodeArray[i].xcoord*xscale_factor, nodeArray[i].ycoord*yscale_factor);
    var neBound = new google.maps.LatLng(nodeArray[i].xcoord*xscale_factor+latlng_pad, nodeArray[i].ycoord*yscale_factor+latlng_pad);
    <span class="comment">//var swBound = new google.maps.LatLng(15, 15);</span>
    var bounds = new google.maps.LatLngBounds(swBound, neBound);
    <span class="comment">//document.getElementById("test_div").innerHTML = nodeArray[i].name;</span>
    <span class="comment">//var bounds = new google.maps.LatLngBounds(swBound, neBound);</span>
    <span class="comment">//var overlayNode = new c_TextOverlay(bounds, nodeArray[i].name, imgmap);</span>
    <span class="reserved">if</span> (nodeArray[i].name != <span class="literal">"You"</span>) {
    var imageNode = new c_ImageOverlay(bounds, <span class="literal">"images/author_node.png"</span>, imgmap, i, nodeArray[i].name, <span class="literal">"images/author_node_select.png"</span>, <span class="literal">"images/author_node_source.png"</span>, <span class="literal">"images/author_node_dest.png"</span>);
    }
    <span class="comment">// if this node is the "You" node...</span>
    <span class="reserved">else</span> {
      var imageNode = new c_ImageOverlay(bounds, <span class="literal">"images/author_node_you.png"</span>, imgmap, i, nodeArray[i].name, <span class="literal">"images/author_node_select.png"</span>, <span class="literal">"images/author_node_source.png"</span>, <span class="literal">"images/author_node_dest.png"</span>);
    }
    <span class="comment">//document.getElementById("text_debug").value += nodeArray[i].name + " " + nodeArray[i].xcoord + " ";</span>
    <span class="comment">//document.getElementById("text_debug").value += nodeArray[i].ycoord+ " " + bounds + "\n";</span>

    authorNodes.push(imageNode);
    authorNames.push(nodeArray[i].name);
    <span class="comment">//nameOverlays.push(overlayNode);</span>
  }
}

<span class="reserved">function</span> initAuthorEdges(edgeArray) {
  <span class="comment">// store the original edges</span>
  origEdges = edgeArray;

  <span class="comment">// options for how to draw edges</span>
  var edgeOpts = {
    strokeColor: <span class="literal">"#FF0000"</span>,
    strokeOpacity: 0.5,
    strokeWeight: 2,
    clickable: false,
    zIndex: 0 
  };

  <span class="comment">//document.getElementById("text_debug").value = "";</span>
  <span class="comment">//document.getElementById("text_debug").value += edgeArray.length + "\n";</span>
  <span class="comment">// go through each edge, find corresponding nodes, get their LatLng coords and</span>
  <span class="comment">// use these to set the path of the edge</span>
  <span class="reserved">for</span> (i=0; i &lt; edgeArray.length; i++) {
    from_idx = edgeArray[i].from;
    to_idx = edgeArray[i].to;
    <span class="comment">//document.getElementById("text_debug").value += i + "\n";</span>
    <span class="comment">//document.getElementById("text_debug").value += "from " + from_idx + " : to " + to_idx + "\n";</span>

    edge = new google.maps.Polyline(edgeOpts);

    <span class="comment">// set path and map</span>
    from_bound = authorNodes[from_idx].getCenter();
    to_bound = authorNodes[to_idx].getCenter();
    <span class="comment">//document.getElementById("text_debug").value += from_bound + " " + to_bound + "\n";</span>
    edge.setPath(Array(from_bound, to_bound));
    edge.setMap(imgmap);

    <span class="comment">// add edge to array</span>
    authorEdges.push(edge);
  }
}

<span class="comment">// Updates the current edge array with the edges in the input array</span>
<span class="comment">// Assumes numerical edge indices correspond to the order of nodes in the node array</span>
<span class="reserved">function</span> updateEdges_old(edgeArray) {
  <span class="comment">// clear old edges</span>
  <span class="reserved">for</span> (i = 0; i &lt; authorEdges.length; i++) {
    authorEdges[i].setMap(null);
  }
  authorEdges = new Array();
  <span class="comment">// add new edges</span>
  initAuthorEdges(edgeArray);
}

<span class="comment">// Initializes author ranking list</span>
<span class="reserved">function</span> initAuthorRanking(idxArray) {
  <span class="comment">//document.getElementById("text_debug").value = "";</span>
  authorIdxToRank = new Array(idxArray.length);
  <span class="reserved">for</span> (i=0; i &lt; idxArray.length; i++) {
    authorRanking.push(idxArray[i]);
    authorIdxToRank[idxArray[i]] = i;
    allIdx.push(i);
    <span class="comment">//document.getElementById("text_debug").value += i + ") " + idxArray[i] + " " + authorNames[idxArray[i]] + "\n";</span>
    <span class="comment">//var onclick_fn = "centerMap(imgmap, authorNodes[" + idxArray[i]  + "].getCenter());";</span>
    <span class="comment">//var onclick_fn = "toggleInfoBox(" + idxArray[i] + ", " + i + ");";</span>
    var onclick_fn = <span class="literal">"registerInfoClick("</span> + idxArray[i] + <span class="literal">");"</span>;
    var outer_text = <span class="literal">""</span>;
    <span class="comment">//var spaces = "   ";</span>
    <span class="comment">//outer_text = outer_text + ")" + </span>
    var new_div = createAnchorControlDivStyled(outer_text, authorNames[idxArray[i]], <span class="literal">"#"</span>, onclick_fn, idxArray[i]);
    new_div.appendChild(createInfoBox(idxArray[i]));
    <span class="comment">// Style these</span>
    new_div.style.height = <span class="literal">"75px"</span>;
    new_div.style.width = <span class="literal">"278px"</span>;
    new_div.style.paddingTop = <span class="literal">"0px"</span>;
    new_div.style.paddingLeft = <span class="literal">"0px"</span>;
    new_div.style.borderBottom = <span class="literal">"1px solid #f3f2e8"</span>;
    <span class="comment">//new_div.style.borderLeft = "1px solid #f3f2e8";</span>
    new_div.style.marginLeft = <span class="literal">"0px"</span>;
    new_div.style.marginTop = <span class="literal">"auto"</span>;
    <span class="comment">//new_div.style.marginBottom = "auto";</span>
    new_div.style.backgroundImage = <span class="literal">"url('images/author_node_info_bg_tall.jpg')"</span>;
    new_div.style.backgroundRepeat = <span class="literal">"repeat-x"</span>;
    new_div.style.color = <span class="literal">"#000000"</span>;
    <span class="comment">//new_div.style.font = "14pt Arial";</span>
    <span class="comment">//new_div.style.fontWeight = "bold";</span>
    <span class="comment">//new_div.onmouseover = new Function("", "this.style.backgroundColor='#669fd3'");</span>
    <span class="comment">//new_div.onmouseout = new Function("", "this.style.backgroundColor=''");</span>
    <span class="comment">//var new_div = createRadioButtonControlDiv(i + ") " + authorNames[idxArray[i]], "nodes", false, onclick_fn);</span>
    document.getElementById(<span class="literal">"name_field"</span>).appendChild(new_div);
  }
}

<span class="comment">// Shows/hides custom overlay based on value of boolean show</span>
<span class="reserved">function</span> showNetworkNodes(show) {
  <span class="reserved">if</span> (show) {
    net.showNodes();
  }
  <span class="reserved">else</span> {
    net.hideNodes();
  }
}

<span class="comment">// Creates a generic checkbox element in a div w/ the text specified + options</span>
<span class="reserved">function</span> createCheckboxControlDiv(outer_text, checked, onclick) {
  var div = document.createElement(<span class="literal">"DIV"</span>);
  <span class="reserved">if</span> (checked) {
    div.innerHTML = <span class="literal">"&lt;input type='checkbox' checked onclick='"</span> + onclick + <span class="literal">"'&gt;"</span> + outer_text;
  }
  <span class="reserved">else</span> {
    div.innerHTML = <span class="literal">"&lt;input type='checkbox' onclick='"</span> + onclick + <span class="literal">"'&gt;"</span> + outer_text;
  }
  <span class="comment">// style properties</span>
  div.style.backgroundColor = <span class="literal">"#ffffff"</span>;
  <span class="comment">//div.style.border = "1px";</span>
  <span class="comment">//div.style.borderColor = "#000000";</span>
  div.style.fontWeight = <span class="literal">"bold"</span>;
  div.style.marginRight = <span class="literal">"5px"</span>;
  div.style.marginTop = <span class="literal">"5px"</span>;
  div.style.padding = <span class="literal">"3px"</span>;
  div.style.border = <span class="literal">"1px solid #000000"</span>;
  
  <span class="reserved">return</span> div;
}

<span class="comment">// Creates a generic div w/ ID as specified for writing text</span>
<span class="reserved">function</span> createTextDiv(inner_text, id) {
  var div = document.createElement(<span class="literal">"DIV"</span>);

  div.setAttribute(<span class="literal">"id"</span>, id);

  div.innerHTML = inner_text;

  div.style.height = <span class="literal">"100px"</span>;
  div.style.width = <span class="literal">"250px"</span>;
  div.style.color = <span class="literal">"#000000"</span>;
  div.style.font = <span class="literal">"12pt Arial"</span>;
  div.style.fontWeight = <span class="literal">"bold"</span>;
  div.style.textAlign = <span class="literal">"right"</span>;
  div.style.marginRight = <span class="literal">"5px"</span>;
  div.style.marginTop = <span class="literal">"5px"</span>;

  <span class="reserved">return</span> div;
}

<span class="comment">// Creates a generic radio button element in a div w/ the text specified + options</span>
<span class="reserved">function</span> createRadioButtonControlDiv(outer_text, grp_name, checked, onclick) {
  var div = document.createElement(<span class="literal">"DIV"</span>);
  <span class="reserved">if</span> (checked) {
    div.innerHTML = <span class="literal">"&lt;input type='radio' name='"</span> + grp_name + <span class="literal">"' checked onclick='"</span> + onclick + <span class="literal">"'&gt;"</span> + outer_text;
  }
  <span class="reserved">else</span> {
    div.innerHTML = <span class="literal">"&lt;input type='radio' name='"</span> + grp_name + <span class="literal">"' onclick='"</span> + onclick + <span class="literal">"'&gt;"</span> + outer_text;
  }
  <span class="comment">// style properties</span>
  div.style.marginTop = <span class="literal">"5px"</span>;
  div.style.marginRight = <span class="literal">"5px"</span>;
  div.style.padding = <span class="literal">"3px"</span>;
  div.style.height = <span class="literal">"19px"</span>;
  div.style.backgroundColor = <span class="literal">"#ffffff"</span>;
  div.style.border = <span class="literal">"1px solid black"</span>;
  div.style.fontWeight = <span class="literal">"bold"</span>;
  <span class="reserved">return</span> div;
}

<span class="comment">// Creates a generic anchor element in a div with specified text, link + options</span>
<span class="reserved">function</span> createAnchorControlDiv(outer_text, link_text, link, onclick) {
  var div = document.createElement(<span class="literal">"DIV"</span>);
  div.innerHTML = outer_text + <span class="literal">"&lt;a href='"</span> + link + <span class="literal">"' onclick='"</span> + onclick + <span class="literal">" return false;'&gt;"</span> + link_text + <span class="literal">"&lt;/a&gt;"</span>;
  <span class="comment">// style properties</span>
  <span class="comment">//div.style.backgroundColor = "#ffffff";</span>
  <span class="comment">//div.style.border = "1px";</span>
  <span class="comment">//div.style.borderColor = "#000000";</span>
  <span class="reserved">return</span> div;
}

<span class="comment">// Creates a generic anchor element in a div with specified text, link + options</span>
<span class="reserved">function</span> createAnchorControlDivStyled(outer_text, link_text, link, onclick, idx) {
  var div = document.createElement(<span class="literal">"DIV"</span>);
  div.innerHTML = outer_text + <span class="literal">"&lt;p&gt;&lt;a style='color: #f3f2e8' onclick='"</span> + onclick + <span class="literal">" return false;'&gt;"</span> + link_text + <span class="literal">"&lt;/a&gt;&lt;/p&gt;"</span>;
  <span class="comment">// get this div's paragraph</span>
  var p = div.children[0];
  <span class="comment">// style the anchor</span>
  p.style.color = <span class="literal">"#f3f2e8"</span>;
  p.style.font = <span class="literal">"13pt Arial"</span>;
  p.style.fontWeight = <span class="literal">"bold"</span>;
  p.style.width = <span class="literal">"160px"</span>;

  <span class="comment">// figure out how to vertically center this</span>
  p.style.marginLeft = <span class="literal">"7px"</span>;
  p.style.cssFloat = <span class="literal">"left"</span>;

  <span class="comment">// get this div's anchor</span>
  <span class="comment">//var a = div.children[0].children[0];</span>

  <span class="comment">//a.color = "#f3f2e8";</span>

  <span class="comment">// add control buttons</span>
  ndiv = document.createElement(<span class="literal">"DIV"</span>);
  ndiv.style.width = <span class="literal">"65px"</span>;
  ndiv.style.height = <span class="literal">"50px"</span>;
  ndiv.style.cssFloat = <span class="literal">"left"</span>;
  ndiv.style.marginRight = <span class="literal">"0px"</span>;
  ndiv.style.marginTop = <span class="literal">"10px"</span>;

  var onclick_fn = <span class="literal">"registerInfoClick("</span> + idx + <span class="literal">"); return false;"</span>;
  var center_fn = <span class="literal">"centerMap(imgmap, authorNodes["</span> + idx + <span class="literal">"].getCenter()); return false;"</span>;
  ndiv.innerHTML += <span class="literal">"&lt;a href='#' onclick='"</span> + center_fn + <span class="literal">"'&gt;&lt;img src='images/center_button_info.png'&gt;&lt;/a&gt;"</span>;
  ndiv.innerHTML += <span class="literal">"&lt;a href='#' onclick='"</span> + onclick_fn + <span class="literal">"'&gt;&lt;img src='images/more_info_button_info.png'&gt;&lt;/a&gt;"</span>;

  <span class="comment">// set anchor spacing</span>
  ndiv.children[0].style.marginBottom = <span class="literal">"10px"</span>;

  div.appendChild(ndiv);

  <span class="reserved">return</span> div;
}

<span class="comment">// Centers a map on the google.maps.LatLng coordinates provided as input</span>
<span class="reserved">function</span> centerMap(map, LatLng) {
  map.setCenter(LatLng);
}

<span class="comment">// Searches the author name list for the input given</span>
<span class="reserved">function</span> searchAuthors(searchStr) {
  <span class="comment">// close any open info boxes just in case</span>
  closeInfoBoxes();
  
  searchStr = trim(searchStr);
  searchStr = searchStr.toLowerCase();

  child_divs = document.getElementById(<span class="literal">"name_field"</span>).childNodes;

  <span class="reserved">for</span> (i=0; i &lt; authorNames.length; i++) {
    cur_name = authorNames[authorRanking[i]].toLowerCase();
    <span class="comment">// if this (sub)string occurs at all, then we'll add it to our list</span>
    <span class="reserved">if</span> (cur_name.indexOf(searchStr) &gt;= 0) {
      <span class="comment">// save this author's index</span>
      <span class="comment">//matches.push(i);</span>
      child_divs[i].style.display = <span class="literal">""</span>;
    }
    <span class="reserved">else</span> {
      child_divs[i].style.display = <span class="literal">"none"</span>;
    }
  }

  <span class="reserved">return</span>;

  <span class="comment">// return if we saw the empty string... it would take too much time to always handle this case</span>
  <span class="reserved">if</span> (searchStr.length == 0) { 
    matches = allIdx;
  }
  <span class="reserved">else</span> {
    <span class="comment">// find a match for the search string</span>
    searchStr = searchStr.toLowerCase();

    matches = new Array();

    child_divs = document.getElementById(<span class="literal">"name_field"</span>).childNodes;

    <span class="reserved">for</span> (i=0; i &lt; authorNames.length; i++) {
      cur_name = authorNames[i].toLowerCase();
      <span class="comment">// if this (sub)string occurs at all, then we'll add it to our list</span>
      <span class="reserved">if</span> (cur_name.indexOf(searchStr) &gt;= 0) {
        <span class="comment">// save this author's index</span>
        matches.push(i);
      }
      <span class="reserved">else</span> {
        child_divs[i].style.display = <span class="literal">"none"</span>;
      }
    }
  }
  
  <span class="reserved">return</span>
  <span class="reserved">for</span> (i=0; i &lt; matches.length; i++) {
    <span class="comment">// TESTING 7/14/10 -- just set the div's visibility to hidden if it doesn't match</span>
    child_divs[matches[i]].style.visibility = <span class="literal">"visible"</span>;
  }

  <span class="reserved">return</span>
  <span class="comment">// now let's get the rank of each match so we can sort on that</span>
  matchRank = new Array();
  <span class="reserved">for</span> (i=0; i &lt; matches.length; i++) {
    matchRank.push(authorIdxToRank[matches[i]]);
  }

  <span class="comment">// sort by rank</span>
  matchRank.sort(compare);

  <span class="comment">// clear the div</span>
  document.getElementById(<span class="literal">"name_field"</span>).innerHTML = <span class="literal">""</span>;

  <span class="comment">// now go through the matches and update the div w/ them </span>
  <span class="reserved">for</span> (i=0; i &lt; matchRank.length; i++) {
    var auth_idx = authorRanking[matchRank[i]];
    <span class="comment">/*
    var onclick_fn = "centerMap(imgmap, authorNodes[" + auth_idx + "].getCenter());";
    var new_div = createAnchorControlDiv(matchRank[i] + ") ", authorNames[auth_idx], "#", onclick_fn);
    //var new_div = createRadioButtonControlDiv(matchRank[i] + ") " + authorNames[auth_idx], "nodes", false, onclick_fn);
    */</span>
    var onclick_fn = <span class="literal">"toggleInfoBox("</span> + auth_idx + <span class="literal">", "</span> + matchRank[i] + <span class="literal">");"</span>;
    var new_div = createAnchorControlDiv(matchRank[i] + <span class="literal">") "</span>, authorNames[auth_idx], <span class="literal">"#"</span>, onclick_fn);
    new_div.appendChild(createInfoBox(auth_idx));
    document.getElementById(<span class="literal">"name_field"</span>).appendChild(new_div);
  }
}

<span class="comment">// Sets a node to find shortest paths</span>
<span class="comment">//  if the from node is already set, then this node is set as the 'to' node, unless</span>
<span class="comment">//  the input index is already set as from or to, in which case it is deselected;</span>
<span class="comment">//  if both fields are set, then it finds the shortest path and displays it</span>
<span class="reserved">function</span> setShortestPathNode_old(idx) {
  <span class="comment">// get the current size of the stack</span>
  cur_len = path_nodes.length;

  <span class="comment">// grab the top of the stack</span>
  old_idx = path_nodes.pop();

  <span class="comment">// if this is not equal to the input idx, then we can assume we want to push the </span>
  <span class="comment">// input idx onto the stack, leaving whatever was there to float away</span>
  <span class="reserved">if</span> (idx != old_idx) {
    <span class="comment">// in this case, we already had one index, and now we're adding another, so assume</span>
    <span class="comment">// that we want to create a path using these nodes</span>
    <span class="reserved">if</span> (cur_len == 1) {
      path_nodes.push(old_idx);
    }
    <span class="reserved">if</span> (cur_len == 2) {
      <span class="comment">// ONE special case we need to handle here b/c of functionality constraints...</span>
      <span class="comment">// What if the "new" second node is actually the first node?  Then probably</span>
      <span class="comment">// *nothing* should happen, but we need to replace the node we popped</span>
      <span class="reserved">if</span> (idx == path_nodes[0]) { 
        path_nodes.push(old_idx);
        <span class="reserved">return</span> false;
      }

      <span class="comment">// otherwise set the former second node to </span>
      <span class="comment">//document.getElementById("img" + old_idx).src="images/author_node.png";</span>
      resetNodeImage(old_idx);
    }

    path_nodes.push(idx);
    <span class="comment">//document.getElementById("img" + idx).src="images/author_node_select.png";</span>
    setNodeImageToSelected(idx);
  }
  <span class="reserved">else</span> {
    <span class="comment">//document.getElementById("img" + old_idx).src="images/author_node.png";</span>
    resetNodeImage(old_idx);
  }

  <span class="comment">// no matter what, clear the current path, since either we changed nodes or we got rid of</span>
  <span class="comment">// one or both nodes</span>
  clearCurrentShortestPathEdges();

  <span class="comment">// here we have an actual path</span>
  <span class="reserved">if</span> (path_nodes.length == 2) {
    to_node = path_nodes[1];
    from_node = path_nodes[0];
  
    <span class="comment">// find path</span>
    drawShortestPath();
  }

  <span class="reserved">return</span> false;
}

<span class="reserved">function</span> setShortestPathNode(idx) {
  <span class="comment">// first, check to see if we're in "shortest path" mode</span>
  <span class="reserved">if</span> (!shortest_path_mode) { <span class="reserved">return</span> false; }

  <span class="comment">// keep track of whether we set an idx this time around</span>
  var set_idx = false;

  <span class="comment">// if the from node has been set and the index is the same as this one, then toggle that index off and return</span>
  <span class="reserved">if</span> (from_node == idx) {
    <span class="comment">/*
    if (to_node != -1) {
      from_node = to_node;
      to_node = -1;
    }
    else {
      from_node = -1;
    }
    */</span>
    <span class="comment">//document.getElementById("img" + idx).src="images/author_node.png";</span>
    resetSPNode(idx);
    <span class="comment">//resetNodeImage(idx);</span>
    
    <span class="reserved">if</span> (to_node != -1) { resetSPNode(to_node); } <span class="comment">//resetNodeImage(to_node); }</span>

    <span class="comment">// clear both nodes</span>
    from_node = -1;
    to_node = -1;
    
    <span class="comment">// might need to clear shortest path edges</span>
    <span class="reserved">if</span> (curShortestPathEdgeIdx.length &gt; 0) {
      clearCurrentShortestPathEdges();
    }

    <span class="reserved">return</span> false;
  }

  <span class="comment">// if the to node is this node (updatd 7/14/10 -- do nothing)</span>
  <span class="reserved">if</span> (to_node == idx) {
    <span class="reserved">return</span> false;
    to_node = -1;
    resetSPNode(idx);
    <span class="comment">//resetNodeImage(idx);</span>
    <span class="comment">// might need to clear shortest path edges</span>
    <span class="reserved">if</span> (curShortestPathEdgeIdx.length &gt; 0) {
      clearCurrentShortestPathEdges();
    }
    <span class="reserved">return</span> false;
  }

  <span class="comment">// in this case, the from node has not been set, so simply set it and return</span>
  <span class="reserved">if</span> (from_node == -1) {
    from_node = idx;
    setSPNodeToSource(idx);
    <span class="comment">//setNodeImageToSource(idx);</span>
    set_idx = true;
    <span class="comment">// only return if to_node is unset</span>
    <span class="reserved">if</span> (to_node == -1) {
      <span class="reserved">return</span> false;
    }
  }

  <span class="comment">// handle the case that both are already set and we try to place a new idx (i.e., one that is</span>
  <span class="comment">// not equal to the current input idx) -- CHANGE to_node to match the input idx!</span>
  <span class="reserved">if</span> (from_node != -1 &amp;&amp; to_node != -1 &amp;&amp; !set_idx) {
    resetSPNode(to_node);
    <span class="comment">//resetNodeImage(to_node);</span>

    <span class="comment">// might need to clear shortest path edges</span>
    <span class="reserved">if</span> (curShortestPathEdgeIdx.length &gt; 0) {
      clearCurrentShortestPathEdges();
    }

    to_node = idx;
    setSPNodeToDest(idx);
    <span class="comment">//setNodeImageToDest(idx);</span>
    <span class="comment">//return false;</span>
  }

  <span class="comment">// if we've gotten here, then from node is set and we aren't toggling the index, so set the to node and</span>
  <span class="comment">// find the shortest path</span>
  <span class="reserved">if</span> (to_node == -1) {
    to_node = idx;
    setSPNodeToDest(idx);
    <span class="comment">//setNodeImageToDest(idx);</span>
  }

  <span class="comment">// find path</span>
  drawShortestPath();

  <span class="reserved">return</span> false;
}

<span class="comment">// Resets a shortest path node</span>
<span class="reserved">function</span> resetSPNode(idx) {
  resetNodeImage(idx);
  
  <span class="reserved">if</span> (from_node == idx) {
    document.getElementById(<span class="literal">"path-source"</span>).innerHTML = <span class="literal">""</span>;
  }
  <span class="reserved">else</span> <span class="reserved">if</span> (to_node == idx) {
    document.getElementById(<span class="literal">"path-dest"</span>).innerHTML = <span class="literal">""</span>;
  }

  document.getElementById(<span class="literal">"path-nodes"</span>).innerHTML = <span class="literal">""</span>;
}

<span class="comment">// Sets a shortest path node to source</span>
<span class="reserved">function</span> setSPNodeToSource(idx) {
  setNodeImageToSource(idx);
  
  document.getElementById(<span class="literal">"path-source"</span>).appendChild(createSPNodeDiv(authorNames[idx], <span class="literal">"source"</span>));
  <span class="comment">//innerHTML = "Source: " + authorNames[idx];</span>
}

<span class="comment">// Sets a shortest path node to destination</span>
<span class="reserved">function</span> setSPNodeToDest(idx) {
  setNodeImageToDest(idx);

  <span class="comment">//document.getElementById("path-dest").appendChild(createSPNodeDiv(authorNames[idx], "dest"));</span>
  <span class="comment">//innerHTML = "Destination: " + authorNames[idx];</span>
}

<span class="comment">// Creates a div to display a shortest path node on the page</span>
<span class="reserved">function</span> createSPNodeDiv(name, type) {
  var div = document.createElement(<span class="literal">"DIV"</span>);

  <span class="comment">// get this div's paragraph</span>
  var p = document.createElement(<span class="literal">"P"</span>);
  <span class="comment">// set the paragraph to the name of the author</span>
  p.innerHTML = name;
  <span class="comment">// style the anchor</span>
  p.style.color = <span class="literal">"#f3f2e8"</span>;
  p.style.font = <span class="literal">"13pt Arial"</span>;
  p.style.fontWeight = <span class="literal">"bold"</span>;
  p.style.width = <span class="literal">"160px"</span>;

  <span class="comment">// figure out how to vertically center this</span>
  p.style.marginLeft = <span class="literal">"7px"</span>;
  p.style.cssFloat = <span class="literal">"left"</span>;

  <span class="comment">// node image</span>
  var img = document.createElement(<span class="literal">"IMG"</span>);

  <span class="comment">// arrow image</span>
  var arrow = document.createElement(<span class="literal">"IMG"</span>);
  var arrow_sz = 35;
  
  <span class="reserved">if</span> (type == <span class="literal">"source"</span>) {
    div.style.borderTop = <span class="literal">"1px solid #f3f2e8"</span>;
    img.src = <span class="literal">"images/author_node_source.png"</span>;
    img.style.marginLeft = <span class="literal">"5px"</span>;

    arrow.src = <span class="literal">"images/sp_arrow_source.png"</span>; 
    arrow.style.width = arrow_sz + <span class="literal">"px"</span>;
  }
  <span class="reserved">else</span> <span class="reserved">if</span> (type == <span class="literal">"dest"</span>) {
    img.src = <span class="literal">"images/author_node_dest.png"</span>;
    img.style.marginLeft = <span class="literal">"5px"</span>;

    arrow.src = <span class="literal">"images/sp_arrow_dest.png"</span>;
    arrow.style.width = arrow_sz + <span class="literal">"px"</span>;
  }
  <span class="reserved">else</span> <span class="reserved">if</span> (type == <span class="literal">"central"</span>) {
    img.src = <span class="literal">"images/author_node.png"</span>;
    img.style.marginLeft = <span class="literal">"35px"</span>;

    arrow.src = <span class="literal">"images/sp_arrow_down.png"</span>;
    arrow.style.height = arrow_sz + <span class="literal">"px"</span>;
  }

  <span class="comment">// style nodes</span>
  img.style.cssFloat = <span class="literal">"left"</span>;
  img.style.width = <span class="literal">"32px"</span>;
  img.style.height = <span class="literal">"32px"</span>;
  img.style.marginTop = <span class="literal">"15px"</span>;

  <span class="comment">// style arrows</span>
  arrow.style.cssFloat = <span class="literal">"left"</span>;
  arrow.style.marginTop = <span class="literal">"20px"</span>;
  arrow.style.marginRight = <span class="literal">"5px"</span>;
 
  <span class="comment">// style paragraph </span>
  p.style.cssFloat = <span class="literal">"left"</span>;

  <span class="comment">// style div</span>
  div.style.height = <span class="literal">"75px"</span>;
  div.style.width = <span class="literal">"278px"</span>;
  div.style.paddingTop = <span class="literal">"0px"</span>;
  div.style.paddingLeft = <span class="literal">"0px"</span>;
  div.style.borderBottom = <span class="literal">"1px solid #f3f2e8"</span>;
  div.style.marginLeft = <span class="literal">"0px"</span>;
  div.style.marginTop = <span class="literal">"auto"</span>;
  div.style.backgroundImage = <span class="literal">"url('images/author_node_info_bg_tall.jpg')"</span>;
  div.style.backgroundRepeat = <span class="literal">"repeat-x"</span>;

  div.appendChild(img);
  div.appendChild(p);
  div.appendChild(arrow);

  <span class="reserved">return</span> div;
}

<span class="comment">// Draws shortest path between nodes based on nodes set</span>
<span class="reserved">function</span> drawShortestPath() {
  <span class="comment">// check the inputs</span>
  <span class="reserved">if</span> (from_node == -1 || to_node == -1) {
    <span class="reserved">return</span> false;
  }
 
  <span class="comment">// send an ajax query to get the edge list</span>
  var opts = {
    type: <span class="literal">"GET"</span>,
    url: <span class="literal">"http://austin.cs.dartmouth.edu:8087/shortestPath"</span>,
    data: <span class="literal">"from_node="</span> + authorNames[from_node] + <span class="literal">"&amp;to_node="</span> + authorNames[to_node],
    success: drawShortestPathAjax
  }

  $.ajax(opts);

  <span class="comment">/*
  document.getElementById("img" + from_node).src = "images/author_node.png";
  document.getElementById("img" + to_node).src = "images/author_node.png";

  from_node = -1;
  to_node = -1;
  */</span>
} 

<span class="comment">// Draws edges returned based on shortest path calculation</span>
<span class="reserved">function</span> drawShortestPathEdges(edgeArray) {
  <span class="comment">// clear shortest path edge idx array</span>
  curShortestPathEdgeIdx = new Array();

  <span class="comment">// options for how to draw edges</span>
  var edgeOpts = {
    strokeColor: <span class="literal">"#0000FF"</span>,
    strokeOpacity: 0.75,
    strokeWeight: 5,
    clickable: false,
    zIndex: 0 
  };

  <span class="comment">// keep track of which nodes are in this path</span>
  curShortestPathNodeIdx = new Array();
  curShortestPathNodeIdx.push(from_node);

  <span class="comment">// loop through all edges, compare to those in edgeArray</span>
  <span class="reserved">for</span> (j = 0; j &lt; edgeArray.length; j++) {
    <span class="reserved">for</span> (i = 0; i &lt; origEdges.length; i++) {
      <span class="comment">// if we found a matching edge</span>
      <span class="comment">// N.B. when we're checking here, need to account for the fact that from/to order might have changed</span>
      <span class="reserved">if</span> (edgeArray[j].from == origEdges[i].from &amp;&amp; edgeArray[j].to == origEdges[i].to) {
        <span class="comment">// change its appearance</span>
        authorEdges[i].setOptions(edgeOpts);
        <span class="comment">// save this idx</span>
        curShortestPathEdgeIdx.push(i);
        <span class="comment">// save the node idx</span>
        <span class="reserved">if</span> (edgeArray[j].from == curShortestPathNodeIdx[curShortestPathNodeIdx.length-1]) {
          <span class="comment">//curShortestPathNodeIdx[curShortestPathNodeIdx.length] = edgeArray[j].to;</span>
          curShortestPathNodeIdx.push(edgeArray[j].to);
        }
        <span class="reserved">else</span> {
          <span class="comment">//curShortestPathNodeIdx[curShortestPathNodeIdx.length] = edgeArray[j].from;</span>
          curShortestPathNodeIdx.push(edgeArray[j].from);
          <span class="comment">//curShortestPathNodeIdx.concat(edgeArray[j].from);</span>
        }
      }
      <span class="reserved">else</span> <span class="reserved">if</span> (edgeArray[j].from == origEdges[i].to &amp;&amp; edgeArray[j].to == origEdges[i].from) {
        <span class="comment">// change its appearance</span>
        authorEdges[i].setOptions(edgeOpts);
        <span class="comment">// save this idx</span>
        curShortestPathEdgeIdx.push(i);
        <span class="comment">// save the node idx</span>
        <span class="reserved">if</span> (edgeArray[j].from == curShortestPathNodeIdx[curShortestPathNodeIdx.length-1]) {
          <span class="comment">//curShortestPathNodeIdx.concat(edgeArray[j].to);</span>
          curShortestPathNodeIdx.push(edgeArray[j].to);
          <span class="comment">//curShortestPathNodeIdx[curShortestPathNodeIdx.length] = edgeArray[j].to;</span>
        }
        <span class="reserved">else</span> {
          <span class="comment">//curShortestPathNodeIdx.concat(edgeArray[j].from);</span>
          curShortestPathNodeIdx.push(edgeArray[j].from);
          <span class="comment">//curShortestPathNodeIdx[curShortestPathNodeIdx.length] = edgeArray[j].from;</span>
        }
      }
    }
  }

  writeShortestPathInfo(curShortestPathNodeIdx);
}

<span class="comment">// Creates an edge w/ specified options</span>
<span class="reserved">function</span> initEdge(edgeOpts, from_bound, to_bound, map) {
  edge = new google.maps.Polyline(edgeOpts);

  edge.setPath(Array(from_bound, to_bound));
  edge.setMap(map);

  <span class="reserved">return</span> edge;
}

<span class="comment">// Clears current shortest path edges</span>
<span class="reserved">function</span> clearCurrentShortestPathEdges() {
  <span class="comment">// options for how to draw edges</span>
  var edgeOpts = {
    strokeColor: <span class="literal">"#FF0000"</span>,
    strokeOpacity: 0.5,
    strokeWeight: 2,
    clickable: false,
    zIndex: 0 
  };

  <span class="reserved">for</span> (j = 0; j &lt; curShortestPathEdgeIdx.length; j++) {
    i = curShortestPathEdgeIdx[j];
    authorEdges[i].setOptions(edgeOpts);
  }
}

<span class="reserved">function</span> writeShortestPathInfo(curPathNodeIdx) {
  cur_div = document.getElementById(<span class="literal">"path-nodes"</span>);

  cur_div.innerHTML = <span class="literal">""</span>;

  <span class="comment">// only write "central" nodes -- i.e., don't rewrite source/dest</span>
  <span class="reserved">for</span> (i=1; i &lt; curPathNodeIdx.length-1; i++) {
    <span class="comment">//cur_div.innerHTML += (i+1) + ") " + authorNames[curPathNodeIdx[i]] + "&lt;br&gt;";</span>
    cur_div.appendChild(createSPNodeDiv(authorNames[curPathNodeIdx[i]], <span class="literal">"central"</span>));
  }

  document.getElementById(<span class="literal">"path-dest"</span>).appendChild(createSPNodeDiv(authorNames[curPathNodeIdx[curPathNodeIdx.length-1]], <span class="literal">"dest"</span>));
}

<span class="comment">// Clears shortest path information</span>
<span class="reserved">function</span> clearShortestPathInfo() {
  <span class="comment">// kludge 7/14/10</span>
  path_nodes = [from_node, to_node];

  <span class="reserved">for</span> (i = 0; i &lt; path_nodes.length; i++) {
    <span class="reserved">if</span> (path_nodes[i] != -1) {
      resetNodeImage(path_nodes[i]);
    }
  }

  from_node = -1;
  to_node = -1;
  path_nodes = new Array();

  <span class="comment">// just in case, we should clear the current edge idx</span>
  curShortestPathEdgeIdx = new Array();

  <span class="comment">// clear out the div that contains info about the nodes in the path</span>
  document.getElementById(<span class="literal">"path-nodes"</span>).innerHTML = <span class="literal">""</span>;
  document.getElementById(<span class="literal">"path-source"</span>).innerHTML = <span class="literal">""</span>;
  document.getElementById(<span class="literal">"path-dest"</span>).innerHTML = <span class="literal">""</span>;
}

<span class="comment">// Sets an author node image to the original node image</span>
<span class="reserved">function</span> resetNodeImage(idx) {
  <span class="comment">//document.getElementById("img" + idx).src="images/author_node.png";</span>
  authorNodes[idx].resetImage();
}

<span class="comment">// Sets an author node image to selected</span>
<span class="reserved">function</span> setNodeImageToSelected(idx) {
  <span class="comment">//document.getElementById("img" + idx).src="images/author_node_select.png";</span>
  authorNodes[idx].setSelectImage();
}

<span class="reserved">function</span> setNodeImageToDest(idx) {
  authorNodes[idx].setDestImage();
}

<span class="comment">// Sets an author node image to source</span>
<span class="reserved">function</span> setNodeImageToSource(idx) {
  authorNodes[idx].setSourceImage();
}

<span class="comment">// Gets the (indices of the) neighbors of a particular node by idx</span>
<span class="reserved">function</span> getNodeNeighbors(idx) {
  <span class="comment">// Go through the edges, find the ones involving this node, and save the names</span>
  var idxArray = new Array();

  <span class="comment">// walk through edge array</span>
  <span class="reserved">for</span> (i=0; i &lt; origEdges.length; i++) {
    <span class="reserved">if</span> (origEdges[i].from == idx) {
      idxArray.push(origEdges[i].to);
    }
    <span class="reserved">else</span> <span class="reserved">if</span> (origEdges[i].to == idx) {
      idxArray.push(origEdges[i].from);
    } 
  }

  <span class="reserved">return</span> idxArray;
}

<span class="comment">// Creates an info box div elt w/ specified options</span>
<span class="reserved">function</span> createInfoBox(idx) {
  var div = document.createElement(<span class="literal">"DIV"</span>);
  div.id = <span class="literal">"info"</span> + idx;
  div.style.visibility = <span class="literal">"hidden"</span>;
  div.style.width = <span class="literal">"100%"</span>;
  div.style.height = <span class="literal">"0px"</span>;
  div.style.overflow = <span class="literal">"auto"</span>;
  div.style.position = <span class="literal">"absolute"</span>;
  div.style.zIndex = <span class="literal">"2"</span>;
  
  <span class="reserved">return</span> div;
}

<span class="comment">// Closes an open info box</span>
<span class="reserved">function</span> closeInfoBox(idx, cur_div) {
  var cur_div = document.getElementById(<span class="literal">"info"</span>+idx);

  cur_div.style.visibility = <span class="literal">"hidden"</span>;
  cur_div.style.marginTop = <span class="literal">"0px"</span>;
  cur_div.style.marginBottom = <span class="literal">"0px"</span>;
  cur_div.style.height = <span class="literal">"0px"</span>;
}

<span class="comment">// Opens an info box and places requisite info inside</span>
<span class="reserved">function</span> openInfoBox(idx, rank_idx) {
  <span class="comment">// quick check to make sure that if we're going to open this info box, then</span>
  <span class="comment">// its corresponding anchor should be showing</span>
  document.getElementById(<span class="literal">"name_field"</span>).childNodes[rank_idx].style.display = <span class="literal">""</span>;

  var cur_div = document.getElementById(<span class="literal">"info"</span>+idx);

  <span class="reserved">if</span> (cur_div.style.visibility == <span class="literal">"hidden"</span>) {
    var height = 135;
    <span class="comment">// get neighbors</span>
    var nbrs = getNodeNeighbors(idx);
    <span class="comment">// clear the current div </span>
    cur_div.innerHTML = <span class="literal">""</span>;
    <span class="comment">// set anchor click fn</span>
    var onclick_fn = <span class="literal">"centerMap(imgmap, authorNodes["</span> + idx  + <span class="literal">"].getCenter()); return false;"</span>;
    <span class="comment">//var new_div = createAnchorControlDiv("", "center map", "#", onclick_fn);</span>
    <span class="comment">//new_div.style.paddingBottom = "5px";</span>
    <span class="comment">//cur_div.appendChild(new_div);</span>

    <span class="comment">// padding space + text</span>
    var p = document.createElement(<span class="literal">"P"</span>);
    <span class="comment">//p.style.font = "16pt Helvetica #3d3d3d";</span>
    p.style.fontSize = <span class="literal">"12pt"</span>;
    p.style.fontWeight = <span class="literal">"bold"</span>;
    p.style.paddingBottom = <span class="literal">"0px"</span>;
    p.innerHTML = authorNames[idx];
    cur_div.appendChild(p);

    var p2 = document.createElement(<span class="literal">"P"</span>);
    p2.style.paddingBottom = <span class="literal">"0px"</span>;
    p2.innerHTML = <span class="literal">"Neighbors:"</span>;
    cur_div.appendChild(p2);

    <span class="comment">// now write in neighbors</span>
    <span class="reserved">for</span> (i=0; i &lt; nbrs.length; i++) {
      <span class="comment">//var a = createAnchorControlDiv("", authorNames[nbrs[i]], "#", "toggleInfoBox(" + nbrs[i] + ", " + authorIdxToRank[nbrs[i]]+ ");");</span>
      var a = createAnchorControlDiv(<span class="literal">""</span>, authorNames[nbrs[i]], <span class="literal">"#"</span>, <span class="literal">"registerInfoClick("</span> + nbrs[i] + <span class="literal">");"</span>);
      <span class="comment">//cur_div.innerHTML += + "&lt;br&gt;";</span>
      cur_div.appendChild(a);
      height += 15;
    }

    cur_div.innerHTML += <span class="literal">"&lt;br&gt;"</span>;

    <span class="comment">// add buttons</span>
    <span class="comment">// center map</span>
    <span class="comment">/*
    cur_div.innerHTML += "&lt;a href='#' id='info_sub_link' onclick='" + onclick_fn + "'&gt;&lt;img src='images/center_button.png' border='0'&gt;&lt;/a&gt;";
    // more info
    cur_div.innerHTML += "&lt;a href='http://en.wikipedia.org/w/index.php?search=" + authorNames[idx] + "' target='_blank'&gt;&lt;img src='images/more_info_button.png' border='0'&gt;&lt;/a&gt;";
    */</span>

    <span class="comment">// a little 'close' anchor:</span>
    cur_div.innerHTML += <span class="literal">"&lt;br&gt;"</span>;
    cur_div.innerHTML += <span class="literal">"&lt;br&gt;"</span>;
    <span class="comment">//cur_div.innerHTML += "&lt;a id='info_sub_link_sub' href='#' onclick='toggleInfoBox(" + idx + "); return false;'&gt;[x] close&lt;/a&gt;";</span>
    cur_div.innerHTML += <span class="literal">"&lt;a id='info_sub_link_sub' href='#' onclick='return registerInfoClick("</span> + idx + <span class="literal">");'&gt;[x] close&lt;/a&gt;"</span>;
    <span class="comment">// set div style params</span>
    cur_div.style.visibility = <span class="literal">"visible"</span>;
    cur_div.style.display = <span class="literal">""</span>;
    cur_div.style.height = height+<span class="literal">"px"</span>;
    <span class="comment">// make variable width</span>
    var width = p.innerHTML.length * 10;
    <span class="reserved">if</span> (width &lt; 235) {
      width = 235;
    }
    <span class="comment">//set width</span>
    cur_div.style.width = width + <span class="literal">"px"</span>;
    <span class="comment">//cur_div.style.width = "240px";</span>
    cur_div.style.paddingLeft = <span class="literal">"7px"</span>;
    <span class="comment">//cur_div.style.paddingTop = "5px";</span>
    cur_div.style.marginLeft = -(width+15) + <span class="literal">"px"</span>;
    cur_div.style.marginTop = <span class="literal">"-10px"</span>;
    cur_div.style.border = <span class="literal">"1px solid black"</span>;
    cur_div.style.backgroundColor = <span class="literal">"#ffffff"</span>;
  }
}

<span class="comment">// Shows an info box for this node's author info</span>
<span class="reserved">function</span> toggleInfoBox(idx, rank_idx) {
  <span class="comment">// in this case, we are closing the box that's open deliberately</span>
  <span class="reserved">if</span> (open_info_box == idx) {
    closeInfoBox(idx);
    resetNodeImage(idx);
    open_info_box = -1;
  }
  <span class="comment">// in this case, there is an open (or closed) info box, and it isn't this one</span>
  <span class="reserved">else</span> <span class="reserved">if</span> (open_info_box != idx) {
    <span class="reserved">if</span> (open_info_box != -1) {
      closeInfoBox(open_info_box);
      resetNodeImage(open_info_box);
      open_info_box = -1;
    }

    open_info_box = idx;
    openInfoBox(idx, rank_idx);
    centerMap(imgmap, authorNodes[idx].getCenter());
    setNodeImageToSelected(idx);
  }
}

<span class="comment">// Closes any and all open info boxes</span>
<span class="reserved">function</span> closeInfoBoxes() {
  <span class="reserved">if</span> (open_info_box != -1) {
    <span class="comment">// might need to make sure that if a node's info box was open, it is def. closed</span>
    <span class="reserved">if</span> (was_map_click) {
      authorNodes[open_info_box].toggleInfoBox();
    }
    <span class="reserved">else</span> {
      toggleInfoBox(open_info_box);
    }
  }

  open_info_box = -1;

  <span class="comment">/*
  if (open_info_box_div != null) {
    closeInfoBox
  }
  */</span>
}

<span class="comment">// Generic click handler for node click events</span>
<span class="comment">// Switches functionality based on current mode</span>
<span class="reserved">function</span> registerNodeClick(idx) {
  registerClick(idx, true);

  <span class="reserved">return</span> false;
}

<span class="comment">// Generic click handler for info bar click events</span>
<span class="reserved">function</span> registerInfoClick(idx) {
  registerClick(idx, false);

  <span class="reserved">return</span> false;
}

<span class="comment">// Global click handler</span>
<span class="reserved">function</span> registerClick(idx, is_map_click) {
  <span class="comment">// first, handle the case that the click was from the info div</span>
  <span class="comment">// SIDEBAR CLICK</span>
  <span class="reserved">if</span> (!is_map_click) {
    <span class="comment">// if we are in the correct mode</span>
    <span class="reserved">if</span> (node_view_mode) {
      <span class="comment">// if there was a click on the map *and* there is an open info box</span>
      <span class="reserved">if</span> (was_map_click &amp;&amp; open_info_box != -1) {
        <span class="comment">// toggle the open info box</span>
        authorNodes[open_info_box].toggleInfoBox();
        open_info_box = -1;

        <span class="comment">// open this info box</span>
        toggleInfoBox(idx, authorIdxToRank[idx]);
        open_info_box = idx;
      }
      <span class="comment">// if we didn't see a map click and there is an info box open other than this one</span>
      <span class="reserved">else</span> <span class="reserved">if</span> (open_info_box != -1 &amp;&amp; open_info_box != idx) {
        toggleInfoBox(open_info_box, authorIdxToRank[idx]);
        open_info_box = -1;

        <span class="comment">// open this info box</span>
        toggleInfoBox(idx, authorIdxToRank[idx]);
        open_info_box = idx;
      }
      <span class="comment">// if this info box is open, close it</span>
      <span class="reserved">else</span> <span class="reserved">if</span> (open_info_box == idx) {
        toggleInfoBox(idx, authorIdxToRank[idx]);
        open_info_box = -1;
      }
      <span class="reserved">else</span> {
        <span class="comment">// open this info box</span>
        toggleInfoBox(idx, authorIdxToRank[idx]);
        open_info_box = idx;
      }
    }

    <span class="comment">// reset click state</span>
    was_map_click = false;
  }
  <span class="comment">// second, handle the case that the click was from the map div</span>
  <span class="comment">// MAP CLICK</span>
  <span class="reserved">else</span> {
    <span class="reserved">if</span> (node_view_mode) {
      <span class="comment">// if the last click was not on the map *and* there is an open info box</span>
      <span class="reserved">if</span> (!was_map_click &amp;&amp; open_info_box != -1) {
        <span class="comment">// toggle the open info box</span>
        toggleInfoBox(open_info_box, authorIdxToRank[open_info_box]);

        <span class="comment">// open this info box</span>
        authorNodes[idx].toggleInfoBox();
        open_info_box = idx;
      }
      <span class="comment">// otherwise, we might need to close a node info box not equal to the current one</span>
      <span class="reserved">else</span> <span class="reserved">if</span> (open_info_box != -1 &amp;&amp; open_info_box != idx) {
        authorNodes[open_info_box].toggleInfoBox();
        open_info_box = -1;

        <span class="comment">// open this info box</span>
        authorNodes[idx].toggleInfoBox();
        open_info_box = idx;
      }
      <span class="comment">// or we might need to close THIS info box</span>
      <span class="reserved">else</span> <span class="reserved">if</span> (open_info_box == idx) {
        authorNodes[open_info_box].toggleInfoBox();
        open_info_box = -1;
      }
      <span class="reserved">else</span> {
        <span class="comment">// open this info box</span>
        authorNodes[idx].toggleInfoBox();
        open_info_box = idx;
      }
    }
    <span class="reserved">else</span> <span class="reserved">if</span> (shortest_path_mode) {
      setShortestPathNode(idx); 
    }
  
    <span class="comment">// reset click state</span>
    was_map_click = true;
  }
}
</pre>
	<hr>



<!-- ========== START OF NAVBAR ========== -->
<a name="navbar_top"><!-- --></a>
<table border="0" width="100%" cellpadding="1" cellspacing="0">
<tr>
<td colspan=2 bgcolor="#EEEEFF" class="NavBarCell1">
<a name="navbar_top_firstrow"><!-- --></a>
<table border="0" cellpadding="0" cellspacing="3">
  <tr align="center" valign="top">
  
  
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="overview-summary.html"><font class="NavBarFont1"><b>Overview</b></font></a>&nbsp;</td>
  <td bgcolor="#FFFFFF" class="NavBarCell1Rev">	&nbsp;<font class="NavBarFont1Rev"><b>File</b></font>&nbsp;</td>
  

  <td bgcolor="#FFFFFF" class="NavBarCell1"> <font class="NavBarFont1">Class</font>&nbsp;</td>
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="overview-tree.html"><font class="NavBarFont1"><b>Tree</b></font></a>&nbsp;</td>
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="index-all.html"--><font class="NavBarFont1"><b>Index</b></font></a>&nbsp;</td>
  <td bgcolor="#EEEEFF" class="NavBarCell1">    <a href="help-doc.html"><font class="NavBarFont1"><b>Help</b></font></a>&nbsp;</td>
  </tr>
</table>
</td>
<td bgcolor="#EEEEFF" align="right" valign="top"><em>
<b></b></em>
</td>
</tr>

<tr>
<td bgcolor="white" class="NavBarCell2"><font size="-2">
&nbsp;PREV&nbsp;
&nbsp;NEXT</font></td>
<td bgcolor="white" class="NavBarCell2"><font size="-2">
  <a href="index.html" target="_top"><b>FRAMES</b></a>  &nbsp;
&nbsp;<a href="overview-summary.html" target="_top"><b>NO FRAMES</b></a>
&nbsp;&nbsp;
<script>
  <!--
  if(window==top) {
    document.writeln('<A HREF="allclasses-noframe.html" TARGET=""><B>All Classes</B></A>');
  }
  //-->
</script>
<noscript>
<a href="allclasses-noframe.html" target=""><b>All Classes</b></a>
</noscript>
</font></td>
</tr>
</table>
<!-- =========== END OF NAVBAR =========== -->

<hr>
<font size="-1">

</font>
<div class="jsdoc_ctime">Documentation generated by <a href="http://jsdoc.sourceforge.net/" target="_parent">JSDoc</a> on Sun Oct 17 18:52:13 2010</div>
</body>
</html>
